/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modules.estoque.bo;

import java.awt.Desktop;
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import modules.estoque.models.dto.Usuario;
import modules.estoque.util.BoxPanel;
import modules.estoque.util.Funcoes;
import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import java.util.HashMap;
import java.util.Map;
import modules.estoque.gui.Aplicativo;
import modules.estoque.models.dao.AbstractDAO;
import modules.estoque.security.WMSSession;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author clezio
 */
public class RelatorioBO {

    private File logo;

    public RelatorioBO() {
        this.logo = new File("img/logo.png");
    }

    public void apuracaoPorEndereco() {
        String sql = "select rua.nome as rua, pa.id as palete,pr.codigo as produto_codigo,pr.descricao as produto_descricao, e.quantidade as quantidade from enderecamentos e "
                + "join produtos pr on (e.produto_id = pr.id) "
                + "join paletes pa on (e.palete_id = pa.id) "
                + "join ruas rua on (pa.rua_id = rua.id)";
        try {
            String nameRelatorio = "relatorios/groupByRua.jasper";
            Map parameters = new HashMap();
            parameters.put("Title", "RelatÃ³rio de ApuraÃ§Ã£o por EndereÃ§o");
            parameters.put("logo", logo);
            obterRelatorio(nameRelatorio, sql, parameters, "ApuraÃ§Ã£o por EndereÃ§o");
        } catch (Exception ex) {
            Funcoes.registrarLogErro(ex);
            Logger.getLogger(RelatorioBO.class.getName()).log(Level.SEVERE, null, ex);
            BoxPanel.showMessageDialog(null, "Ocorreu um erro na geraÃ§Ã£o do relatÃ³rio. Por favor tente novamente.");

        }
    }

    public void apuracaoGeral() {
        String sql = "select pr.codigo as produto_codigo,pr.descricao as produto_descricao, sum(e.quantidade) as quantidade from enderecamentos e "
                + "join produtos pr on (e.produto_id = pr.id) "
                + "join paletes pa on (e.palete_id = pa.id) "
                + "join ruas rua on (pa.rua_id = rua.id) "
                + "group by pr.codigo,pr.descricao";
        try {
            String nameRelatorio = "relatorios/apuracaoGeral.jasper";
            Map parameters = new HashMap();
            parameters.put("Title", "RelatÃ³rio de ApuraÃ§Ã£o de Estoque");
            parameters.put("logo", logo);

            obterRelatorio(nameRelatorio, sql, parameters, "ApuraÃ§Ã£o de Estoque");
        } catch (Exception ex) {
            Funcoes.registrarLogErro(ex);
            Logger.getLogger(RelatorioBO.class.getName()).log(Level.SEVERE, null, ex);
            BoxPanel.showMessageDialog(null, "Ocorreu um erro na geraÃ§Ã£o do relatÃ³rio. Por favor tente novamente.");

        }
    }
    
    private void obterRelatorio(String nameRelatorio, String sql, Map parametros, String namePdf) throws JRException {
        Thread t = new Thread(new RunRelatorio(nameRelatorio, sql, parametros, namePdf));
        t.start();
    }
    
    public class RunRelatorio implements Runnable {

        private String namePdf;
        private String nameRelatorio;
        private Map parameters;
        private String sql;

        public RunRelatorio(String nameRelatorio, String sql, Map parameters, String namePdf){
            this.namePdf = namePdf;
            this.nameRelatorio = nameRelatorio;
            this.parameters = parameters;
            this.sql = sql;
        }

        public void run() {
            Connection conexao = null;
            try {
                Aplicativo aplicativo = WMSSession.getInstance().getAplicativo();
                conexao = new AbstractDAO().obterConexao();
                JRResultSetDataSource jrRS = new JRResultSetDataSource(
                        conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(sql));
                // Carrega os arquivos jasper
                aplicativo.getLbNotificacao().setText("Carregando relatÃ³rio");
                JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(nameRelatorio);
                JasperPrint jasperPrint = JasperFillManager.fillReport(relatorioJasper, parameters, jrRS);
                aplicativo.getLbNotificacao().setText("Gerando arquivo pdf");
                File file = new File("tmp/" + namePdf + ".pdf");
                if (file.exists()) {
                    if (!file.delete()) {
                        conexao.close();
                        aplicativo.getLbNotificacao().setText("");
                        BoxPanel.showMessageDialog(null, "Possivelmente existe um relatÃ³rio aberto. \r\nÃ‰ necessÃ¡rio fechÃ¡-lo antes de gerar um novo relatÃ³rio.");
                        return;
                    }
                }
                JasperExportManager.exportReportToPdfFile(jasperPrint, "tmp/" + namePdf + ".pdf");
                conexao.close();
                Desktop desktop = java.awt.Desktop.getDesktop();
                desktop.open(new File("tmp/" + namePdf + ".pdf"));
//                Thread.sleep(2000);
                aplicativo.getLbNotificacao().setText("");
                
            } catch (Exception ex) {
                JRException e = (JRException) ex;
                Logger.getLogger(RelatorioBO.class.getName()).log(Level.SEVERE, null, e);
            } finally {
                try {
                    conexao.close();
                } catch (SQLException ex) {
                    Logger.getLogger(RelatorioBO.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
